package com.bd.scm.dao.mapper.user;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bd.scm.domain.dto.user.PersonnelFilesDto;
import com.bd.scm.domain.dto.user.UserDto;
import com.bd.scm.domain.dto.user.UserOfLeaveBatchDto;
import com.bd.scm.domain.models.user.DtUser;
import com.bd.scm.domain.models.user.PersonnelFilesImport;
import com.bd.scm.domain.models.user.UserVacationImport;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 员工Mapper接口
 * User: _Cps
 * Date: 2019.08.28 16:45
 */
public interface DtUserMapper extends BaseMapper<DtUser> {

    /**
     * 获取人员（包含假期额度数据）
     *
     * @param userOfLeaveBatchDto
     * @return
     */
    List<UserOfLeaveBatchDto> getUserInfoList(@Param("userOfLeaveBatchDto") UserOfLeaveBatchDto userOfLeaveBatchDto);

    /**
     * 获取人员（结合工作日历）
     *
     * @param userOfLeaveBatchDto
     * @return
     */
    List<UserOfLeaveBatchDto> getUserCalendarInfoList(@Param("userOfLeaveBatchDto") UserOfLeaveBatchDto userOfLeaveBatchDto);


    /**
     * 人员列表
     *
     * @param doorInfo
     * @param personnelFilesDto
     * @return
     */
    IPage<PersonnelFilesDto> getUserList(Page<PersonnelFilesDto> doorInfo, PersonnelFilesDto personnelFilesDto);

    /**
     * 人员列表
     *
     * @param
     * @return
     */
    List<PersonnelFilesDto> getManualUserList(PersonnelFilesDto personnelFilesDto);


    /**
     * 新增判断工号是否重复
     *
     * @param personnelFilesDto
     * @return
     */
    int getUserNo(PersonnelFilesDto personnelFilesDto);

    /**
     * 新增判断身份证是否重复
     *
     * @param personnelFilesDto
     * @return
     */
    int getUserId(PersonnelFilesDto personnelFilesDto);

    /**
     * 修改判断工号是否重复
     *
     * @param personnelFilesDto
     * @return
     */
    int isExistUserNo(PersonnelFilesDto personnelFilesDto);

    /**
     * 修改人员
     *
     * @param personnelFilesDto
     * @return
     */
    int updatePerson(PersonnelFilesDto personnelFilesDto);

    String getActypeById(PersonnelFilesDto personnelFilesDto);

    /**
     * 修改消费权限
     *
     * @param personnelFilesDto
     * @return
     */
    int updateAcType(PersonnelFilesDto personnelFilesDto);


    /**
     * 权限组
     *
     * @param personnelFilesDto
     */
    int execClientUserLimits(PersonnelFilesDto personnelFilesDto);

    /**
     * 修改添加日志
     *
     * @param personnelFilesDto
     */
    void insertUserLogByUp(PersonnelFilesDto personnelFilesDto);

    /**
     * 修改添加日志
     *
     * @param personnelFilesDto
     */
    void insertWtPublicByUp(PersonnelFilesDto personnelFilesDto);

    /**
     * 根据编号查询人员信息
     *
     * @param personnelFilesDto
     * @return
     */
    PersonnelFilesDto queryPersonById(PersonnelFilesDto personnelFilesDto);

    /**
     * 离职人员
     *
     * @param personnelFilesDto
     * @return
     */
    int quitPerson(PersonnelFilesDto personnelFilesDto);

    /**
     * 离职添加日志
     *
     * @param personnelFilesDto
     */
    void insertUserLogByQuit(PersonnelFilesDto personnelFilesDto);

    /**
     * 离职添加日志
     *
     * @param personnelFilesDto
     */
    void insertWtPublicByQuit(PersonnelFilesDto personnelFilesDto);

    /**
     * 添加临时调动信息
     *
     * @param personnelFilesDto
     * @return
     */
    int addLoanInfo(PersonnelFilesDto personnelFilesDto);

    /**
     * 获取部门信息
     *
     * @param personnelFilesDto
     * @return
     */
    PersonnelFilesDto getDepInfoNew(PersonnelFilesDto personnelFilesDto);

    //调动
    String getDepSerial(PersonnelFilesDto personnelFilesDto);

    void realUserRemove(PersonnelFilesDto personnelFilesDto);

    int transferUser(PersonnelFilesDto personnelFilesDto);

    void insertTransferWt(PersonnelFilesDto personnelFilesDto);

    void insertTransferLog(PersonnelFilesDto personnelFilesDto);


    /**
     * 更新人员编号
     */
    public void updateUserSerial();

    /**
     * 获取人员编号及工号
     */
    public PersonnelFilesDto getUserSerialAndNo();

    /**
     * 获取身份证号获取人员信息
     *
     * @param
     * @return 人员信息
     */
    public PersonnelFilesDto getUserInfoByCardId(PersonnelFilesDto p);


    /**
     * 获取部门信息
     *
     * @param personnelFilesDto
     * @return
     */
    PersonnelFilesDto getDepInfo(PersonnelFilesDto personnelFilesDto);

    /**
     * 往TmpDtUser添加数据
     *
     * @param personnelFilesDto
     */
    void insertTmpDtUser(PersonnelFilesDto personnelFilesDto);

    /**
     * 新增用户用于人脸
     *
     * @param personnelFilesDto
     */
    void insertTmpDtUserByFace(PersonnelFilesDto personnelFilesDto);

    /*
        添加假期信息
     */
    void insertVacation(PersonnelFilesDto personnelFilesDto);

    /**
     * 往DtAcUser里添加数据
     *
     * @param personnelFilesDto
     */
    void insertDtAcUser(PersonnelFilesDto personnelFilesDto);

    /**
     * 往DtAcLink里添加数据
     *
     * @param personnelFilesDto
     */
    void insertDtAcLink(PersonnelFilesDto personnelFilesDto);

    /**
     * 添加日志
     *
     * @param personnelFilesDto
     */
    void insertUserLogByAdd(PersonnelFilesDto personnelFilesDto);

    /**
     * 添加日志
     *
     * @param personnelFilesDto
     */
    void insertKqfxRiZhi(PersonnelFilesDto personnelFilesDto);

    /**
     * 添加日志
     *
     * @param personnelFilesDto
     */
    void insertWtPublicByAdd(PersonnelFilesDto personnelFilesDto);

    /**
     * 获取账户类型
     *
     * @return
     */
    List<PersonnelFilesDto> getacTypeList();

    /**
     * 获取省份
     *
     * @return
     */
    List<PersonnelFilesDto> getNation();

    /**
     * 获取民族
     *
     * @return
     */
    List<PersonnelFilesDto> getNative();

    /**
     * 获取档案类型
     *
     * @return
     */
    List<PersonnelFilesDto> getUserType();

    /**
     * 获取考勤打卡信息.
     *
     * @param
     * @return 籍贯信息
     */
    List<PersonnelFilesDto> getkqdkLxList();

    /**
     * 获取就餐信息.
     *
     * @param
     * @return 籍贯信息
     */
    List<PersonnelFilesDto> getjcLxList();

    /**
     * 导入新增临时表
     *
     * @param tableName
     * @return
     */
    int createLsTable(@Param("tableName") String tableName);

    /**
     * 判断假期表是否存在该人员
     *
     * @param personnelFilesImport
     * @return
     */
    int vacationIsExist(PersonnelFilesImport personnelFilesImport);

    /**
     * 导入往假期表加数据
     *
     * @param personnelFilesImport
     * @return
     */
    int insertVacationByimport(PersonnelFilesImport personnelFilesImport);


    Long getUserSerial();

    /**
     * 导入将数据添加到临时表
     *
     * @param personnelFilesImport
     * @return
     */
    int addUserLinShi(PersonnelFilesImport personnelFilesImport);

    /**
     * 导入存储过程
     *
     * @param personnelFilesImport
     * @return
     */
    int execImportUser(PersonnelFilesImport personnelFilesImport);

    /**
     * 同步人员新建临时表
     *
     * @param tableName
     */
    void createLsTableBySyn(@Param("tableName") String tableName);

    /**
     * 同步将数据添加到临时表
     *
     * @param personnelFilesImport
     * @return
     */
    int addSynchronizationLinShi(PersonnelFilesImport personnelFilesImport);

    /**
     * 同步存储过程
     *
     * @param personnelFilesImport
     * @return
     */
    int execSynUser(PersonnelFilesImport personnelFilesImport);

    int execAddToTmp();

    /**
     * 手动 自动分别添加调用
     *
     * @return
     */
    int execSynDep();

    /**
     * 手动同步人员数据
     *
     * @param personnelFilesDto
     * @return
     */
    int manualSynUserInfo(PersonnelFilesDto personnelFilesDto);

    /**
     * 根据登录人获取第一级审批人（个人）.
     * 操作人所在部门/科室内的符合条件的人员（安全级别33-36）
     *
     * @return
     */
    List<PersonnelFilesDto> getApproverList(String userSerial);

    /**
     * 获取登录人满足的部门编号--个人二级使用
     *
     * @param userSerial
     * @return
     */
    String findDepParentID(String userSerial);

    /**
     * 获取登录人满足的部门编号-批量一级使用
     *
     * @param userSerial
     * @return
     */
    String findDepParentID2(String userSerial);

    /**
     * 获取登录人满足的部门编号-批量二级使用
     *
     * @param userSerial
     * @return
     */
    String findDepParentID3(String userSerial);

    /**
     * 根据登录人获取第二级审批人(个人).
     *
     * @return
     */
    List<PersonnelFilesDto> getLabourUnionApproverList(String userSerial);

    /**
     * 根据登录人获取第一级审批人（批量）.
     *
     * @return
     */
    List<PersonnelFilesDto> getFirstListByBatch(String userSerial);

    /**
     * 根据登录人获取第二级审批人（批量）.
     *
     * @return
     */
    List<PersonnelFilesDto> getSecondListByBatch(String userSerial);


    /**
     * 根据人员ID查看该人员是否在生产制造部中.
     *
     * @param userSerial
     * @return
     */
    Integer getUserCountById(String userSerial);


    /**
     * 手动同步数据
     */
    void manualSynUser();

    /**
     * 创建数据库服务
     */
    void execStartUsing();

    /**
     * 自动同步人员数据
     */
    void execSelfMotionsynuser();

    /**
     * 将数据添加到部门临时表中
     */
    void execSelfMotionaddDataToTmpDep();

    /**
     * 关闭数据库服务
     */
    void execClose();

    /**
     * 获取所属公司集合.
     *
     * @return
     */
    List<String> getUserCompany();

    /**
     * 获取员工类型集合.
     *
     * @return
     */
    List<String> getUserSnyLx();

    /**
     * 获取员工状态集合.
     *
     * @return
     */
    List<String> getUserSnyType();

    /**
     * 查询所有工作日历
     *
     * @return
     */
    List<JSONObject> findBdKqWorkCalendarList();

    //计算授乳假

    /**
     * 判断是否存在假期数据
     *
     * @param personnelFilesDto
     * @return
     */
    String findKqHolidaysTimeId(PersonnelFilesDto personnelFilesDto);

    /**
     * 查看授乳假有效时间内包含多少双休与节假日
     *
     * @param personnelFilesDto
     * @return
     */
    int getWorkCount(PersonnelFilesDto personnelFilesDto);

    /**
     * 添加授乳假
     *
     * @param personnelFilesDto
     * @return
     */
    int insertBdKqHolidaysTime(PersonnelFilesDto personnelFilesDto);

    /**
     * 修改授乳假分钟数
     *
     * @return
     */
    int updateLactational(PersonnelFilesDto personnelFilesDto);

    /**
     * 添加年假时间明细数据
     *
     * @param personnelFilesDto
     * @return
     */
    int insertBdKqHolidaysaAnnual(PersonnelFilesDto personnelFilesDto);

    /**
     * 添加授乳假时间明细数据
     *
     * @param personnelFilesDto
     * @return
     */
    int insertBdKqHolidaysLactational(PersonnelFilesDto personnelFilesDto);

    /**
     * 添加人员全年的普通班次 除了封账月份
     *
     * @param personnelFilesDto
     */
    void addScheduleCalendarPuTong(PersonnelFilesDto personnelFilesDto);

    /**
     * 根据部门ID查询人员ID
     *
     * @param personnelFilesDto
     * @return
     */
    List<String> getUserSerialList(PersonnelFilesDto personnelFilesDto);

    /**
     * 获取职务列表.
     *
     * @return
     */
    List<String> getJobGrade();

    /**
     * 获取岗位级别列表.
     *
     * @return
     */
    List<String> getTechnologicalJob();

    /**
     * 根据微信账号是否能查询到信息
     *
     * @param weChatId
     * @return
     */
    int fingUserWxCount(String weChatId);

    /**
     * 根据工号密码登录
     *
     * @param object
     * @return
     */
    int getUserByAccountAndPswCount(JSONObject object);

    /**
     * 绑定企业微信ID 通过工号  密码
     *
     * @param object
     * @return
     */
    int updateUser(JSONObject object);

    /**
     * 根据人员id获取该人员部门下的审批人，即为二级审批人.
     *
     * @param userSerial
     * @return
     */
    List<String> getDeptCustByUserId(Long userSerial);

    /**
     * 根据人员id获取该人员部门下的审批人，即为二级审批人.
     * @param userSerial
     * @return
     */
    List<JSONObject> getDeptCustByUserNo(Long userSerial);

    /**
     * 根据人员ID修改人员表中人脸信息，有2  无0
     * * @param userSerial
     */
    void updateUserFaceById(@Param("userSerial") Long userSerial,@Param("faceState") Integer faceState);

    /**
     * 添加人脸日志记录
     * @param object
     */
    void insertBdFaceUploadLog(JSONObject object);

    /**
     * 更新人脸上传日期
     * @param object
     */
    void updateUserRlDate(JSONObject object);
}
